home *** CD-ROM | disk | FTP | other *** search
/ Gigarom 1 / Gigarom Macintosh Archives (Quantum Leap)(CDRM1080320)(1993).iso / FILES / DEV / I-Z / Lex.cpt / Lex / LEXLIB.π folder / LEXSWI.C < prev    next >
Text File  |  1990-06-19  |  3KB  |  109 lines

  1. /*
  2.   HEADER: CUG    nnn.nn;
  3.   TITLE:    LEX - A Lexical Analyser Generator
  4.   VERSION:       1.0 for IBM-PC
  5.   DATE:    Jan 30, 1985
  6.   DESCRIPTION:   A Lexical Analyser Generator. From UNIX
  7.   KEYWORDS:      Lexical Analyser Generator YACC C PREP
  8.   SYSTEM:    IBM-PC and Compatiables
  9.   FILENAME:      LEXSWI.C
  10.   WARNINGS:      This program is not for the casual user. It will
  11.     be useful primarily to expert developers.
  12.   CRC:    N/A
  13.   SEE-ALSO:      YACC and PREP
  14.   AUTHORS:       Scott Guthery 11100 leafwood lane Austin, TX 78750
  15.   COMPILERS:     DESMET-C
  16.   REFERENCES:    UNIX Systems Manuals
  17.   Adapted for using THINK C in 1990, lexswitch also reads resources from
  18.   the resource fork instaed of including tables. MM 90/06/18
  19. */
  20. /*
  21.  * lexswitch -- switch lex tables
  22.  */
  23.  
  24. /*
  25.  * Bob Denny     28-Aug-82  Remove reference to stdio.h
  26.  * Scott Guthery 20-Nov-83      Adapt for IBM PC & DeSmet C
  27.  */
  28.  
  29. #include    <stdlib.h>
  30. #include "lex.h"
  31.  
  32. #define    USE_RESOURCES
  33.  
  34. extern struct lextab *_tabp;
  35.  
  36. #ifdef    USE_RESOURCES
  37. static    void *
  38. getLTABresource(SHORTINT id) {
  39.     void    **h;
  40.     if(id) {
  41.         h = (void **)GetResource('LTAB', id);
  42.         if(!h) {
  43.             lexerror("can't find LTAB resource %d", id);
  44.             exit(1);
  45.             }
  46. #ifdef    DEBUG
  47.         else
  48.             printf((char *)"loading LTAB resource %d\n", id);
  49. #endif
  50.         MoveHHi(h);
  51.         HLock(h);
  52.         return(*h);
  53.         }
  54.     return NULL;
  55.     }
  56. #endif
  57.  
  58. /*
  59.  *    we might even consider releasing the old table if inited from
  60.  *    resources!! and setting llresinit to 0 again;
  61.  *
  62.  */
  63.  
  64.  
  65.  
  66. struct lextab *
  67. lexswitch(struct lextab *lp)
  68. {
  69.     register struct lextab *olp;
  70. #ifdef    USE_RESOURCES
  71.     LEXT    lext, **lextH;
  72.     void    **h;
  73. #endif
  74.  
  75. #ifdef    USE_RESOURCES
  76.     /* now check or it is initialized */
  77.     if(lp->llresinit == 0 && lp->llresid != 0) {
  78.         lextH = (LEXTHandle)GetResource('LEXT', lp->llresid);
  79.         if(!lextH) {
  80.             lexerror("can't find LEXT resource %d", lp->llresid);
  81.             exit(1);
  82.             }
  83. #ifdef    DEBUG
  84.         else
  85.             printf((char *)"loading LEXT resource %d\n", lp->llresid);
  86. #endif
  87.             
  88.         BlockMove(*lextH, &lext, (long)sizeof(lext));
  89.         ReleaseResource(lextH);    /* release it */
  90.         
  91.         lp->llfinal = getLTABresource(lext.rfinal);
  92.         lp->llnext = getLTABresource(lext.rnext);
  93.         lp->llcheck = getLTABresource(lext.rcheck);
  94.         lp->lldefault = getLTABresource(lext.rdefault);
  95.         lp->llbase = getLTABresource(lext.rbase);
  96.         lp->lllook = getLTABresource(lext.rlook);
  97.         lp->llign = getLTABresource(lext.rign);
  98.         lp->llbrk = getLTABresource(lext.rbrk);
  99.         lp->llill = getLTABresource(lext.rill);
  100.         lp->llendst = lext.nstates;
  101.         lp->llnxtmax = lext.nnext;
  102.         lp->llresinit = 1;
  103.         }
  104. #endif
  105.     olp = _tabp;
  106.     _tabp = lp;
  107.     return(olp);
  108. }
  109.